home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume13 / lj2ps / part01 next >
Encoding:
Text File  |  1990-07-02  |  18.0 KB  |  490 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v13i086: lj2ps (01 of 12), a LaserJet to PostScript Translator
  3. From: lishka@uwslh.slh.wisc.edu (Chris Lishka (relaxing in the Mad-City) )
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 13, Issue 86
  7. Submitted-by: lishka@uwslh.slh.wisc.edu (Chris Lishka (relaxing in the Mad-City) )
  8. Archive-name: lj2ps/part01
  9.  
  10. I submit for inclusion in comp.sources.misc the program "lj2ps"
  11. (revision 1.1, release version), a LaserJet to PostScript translator.
  12. lj2ps is able to convert a subset of LaserJet PCL 4 that includes page
  13. motion, page setup, primary font selection, and text.  It is not able
  14. to do macros, position stack commands, graphics (bitmap or
  15. patterns/grayscale), or downloadable fonts.  However, the scanner
  16. *does* recognize all of the PCL 4 commands, and I have added many
  17. hooks for the unimplemented commands.  Therefore, it should not be
  18. too difficult to add in the features you need. 
  19.  
  20. Included in this distribution is the source for lj2ps, documentation,
  21. a test suite, and a metrics suite.  The source code for lj2ps is
  22. should be very portable, and should run on everything from PC's to
  23. mainframes without much modification (although I have only tried it on
  24. a 4.3BSD Unix system).  Please see the README file (right after the
  25. manifest below) for more information.
  26.  
  27. I hope you enjoy it!
  28.  
  29.                         .oO Chris Oo.
  30.  
  31. Christopher Lishka 608-262-4485  "Dad, don't give in to mob mentality!"
  32. Wisconsin State Lab. of Hygiene                                -- Bart Simpson
  33.    lishka@uwslh.slh.wisc.edu     "I'm not, Son.  I'm jumping on the bandwagon."
  34.    uunet!uwvax!uwslh!lishka                                    -- Homer Simpson
  35.  
  36.  
  37. ---- Cut Here and unpack ----
  38. #!/bin/sh
  39. # This is a shell archive (shar 3.21)
  40. # made 06/30/1990 21:08 UTC by lishka@uwslh.slh.wisc.edu
  41. # Source directory /usr/10/src/local/lj2ps/DIST
  42. #
  43. # existing files will NOT be overwritten
  44. #
  45. # This shar contains:
  46. # length  mode       name
  47. # ------ ---------- ------------------------------------------
  48. #   9916 -rw-rw-r-- README
  49. #   2518 -rw-r--r-- Makefile
  50. #  73533 -rw-rw-r-- MetricsSuite/DiagRules
  51. #   5279 -rw-rw-r-- MetricsSuite/HorizMove
  52. #  42068 -rw-rw-r-- MetricsSuite/Letters
  53. #  32131 -rw-rw-r-- MetricsSuite/NumbersAndSymbols
  54. #  11972 -rw-rw-r-- MetricsSuite/Spaces
  55. #    267 -rw-rw-r-- MetricsSuite/VertMove
  56. #   5202 -rw-rw-r-- MetricsSuite/diagrule
  57. #    748 -rw-rw-r-- MetricsSuite/fonts
  58. #    335 -rw-rw-r-- MetricsSuite/hmove
  59. #   2764 -rw-rw-r-- MetricsSuite/letters
  60. #   2253 -rw-rw-r-- MetricsSuite/numbers.and.symbols
  61. #    124 -rwxr-xr-x MetricsSuite/run
  62. #    814 -rw-rw-r-- MetricsSuite/spaces
  63. #    201 -rw-rw-r-- MetricsSuite/vmove
  64. #   1236 -rw-rw-r-- TestSuite/ClearMargins
  65. #   1788 -rw-rw-r-- TestSuite/HMI
  66. #    425 -rw-rw-r-- TestSuite/HMotion-Cols
  67. #    454 -rw-rw-r-- TestSuite/HMotion-Decipoints
  68. #    440 -rw-rw-r-- TestSuite/HMotion-Dots
  69. #    358 -rw-rw-r-- TestSuite/HalfLineFeed
  70. #    594 -rw-rw-r-- TestSuite/LinesPerInch
  71. #    800 -rw-rw-r-- TestSuite/NumberOfCopies
  72. #    544 -rw-rw-r-- TestSuite/Orientation
  73. #   7512 -rw-rw-r-- TestSuite/PFontAttributes
  74. #    368 -rw-rw-r-- TestSuite/PaperInputControl
  75. #    285 -rw-rw-r-- TestSuite/Reset
  76. #   1663 -rw-rw-r-- TestSuite/RightLeftMargins
  77. #  19426 -rw-rw-r-- TestSuite/Tabs
  78. #    991 -rw-rw-r-- TestSuite/TextLength
  79. #    571 -rw-rw-r-- TestSuite/TopMargin
  80. #    334 -rw-rw-r-- TestSuite/Underlining
  81. #    293 -rw-rw-r-- TestSuite/VHMotion-ColRow
  82. #    303 -rw-rw-r-- TestSuite/VHMotion-Decipoints
  83. #    289 -rw-rw-r-- TestSuite/VHMotion-Dots
  84. #    496 -rw-rw-r-- TestSuite/VMI
  85. #    642 -rw-rw-r-- TestSuite/VMotion-Decipoints
  86. #    630 -rw-rw-r-- TestSuite/VMotion-Dots
  87. #    613 -rw-rw-r-- TestSuite/VMotion-Rows
  88. #    748 -rw-rw-r-- TestSuite/fonts
  89. #    154 -rwxr-xr-x TestSuite/run
  90. #    871 -rw-r--r-- doc/BugFile
  91. #  12487 -rw-rw-r-- doc/Copying
  92. #   2980 -rw-r--r-- doc/LogFile
  93. #   1683 -rw-rw-r-- doc/compile.options.doc
  94. #   4873 -rw-rw-r-- doc/limitations.doc
  95. #   4619 -rw-rw-r-- doc/lj2ps.l
  96. #    657 -rw-rw-r-- doc/measurements.doc
  97. #  17644 -rw-r--r-- doc/parameter.scanner.idraw
  98. #   6829 -rw-rw-r-- doc/scanner.doc
  99. #   3480 -rw-rw-r-- doc/suggestions.doc
  100. #   3131 -rw-rw-r-- doc/supported.commands.doc
  101. #  40749 -rw-r--r-- doc/text.scanner.idraw
  102. #   2950 -rw-r--r-- errors.c
  103. #   1170 -rw-r--r-- errors.h
  104. #  20389 -rw-r--r-- lj.c
  105. #  13148 -rw-r--r-- lj.h
  106. #   8092 -rw-r--r-- lj2ps.c
  107. #   1251 -rw-r--r-- lj2ps.h
  108. #  33110 -rw-r--r-- ljcmds.c
  109. #   2558 -rw-r--r-- ljcmds.h
  110. #  16148 -rw-r--r-- ljfonts.c
  111. #   1258 -rw-r--r-- ljfonts.h
  112. #  32557 -rw-r--r-- scan.c
  113. #   3044 -rw-r--r-- scan.h
  114. #   5589 -rw-r--r-- transform.c
  115. #   1091 -rw-r--r-- transform.h
  116. #
  117. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  118.  then TOUCH=touch
  119.  else TOUCH=true
  120. fi
  121. # ============= README ==============
  122. if test X"$1" != X"-c" -a -f 'README'; then
  123.     echo "File already exists: skipping 'README'"
  124. else
  125. echo "x - extracting README (Text)"
  126. sed 's/^X//' << 'SHAR_EOF' > README &&
  127. X                lj2ps
  128. X           A LaserJet PCL to PostScript Translator
  129. X
  130. X            Version 1.1 (release)
  131. X
  132. X              Christopher Lishka
  133. X        Wisconsin State Laboratory of Hygiene
  134. X              Data Processing Department
  135. X
  136. X                June 30th, 1990
  137. X
  138. X
  139. X                  Contents:
  140. X
  141. X        1. Introduction
  142. X        2. This Distribution, and How To Create lj2ps
  143. X        3. Implementation Notes
  144. X        4. Miscellaneous (Things I Have To Get Off My Chest)
  145. X        5. Contacting Me
  146. X
  147. X
  148. X1. Introduction
  149. X
  150. XThe lj2ps program translates HP LaserJet PCL ("Page Control Language")
  151. Xto PostScript.  Currently it converts a subset of the LaserJet Series
  152. XII language (PCL 4) to device-independent PostScript.
  153. X
  154. Xlj2ps was originally written to allow my organization to "upgrade" our
  155. XLaserJets to LaserWriters, yet still have a way to print PCL files.
  156. XDue to a lack of time, not all of PCL is emulated (this is discussed
  157. Xbelow).  I am releasing this program to the "real world" at the
  158. Xsuggestion of by boss and coworkers, and with the hope that others
  159. Xwill also find this program useful and may even extend its
  160. Xcapabilities.
  161. X
  162. X
  163. X2. This Distribution, and How To Create lj2ps
  164. X
  165. XIncluded in this distribution are all of the source files for lj2ps,
  166. Xdocumentation, a test suite, and a metrics suite.
  167. X
  168. XAll source files are included in the top level directory, along with
  169. Xthe Makefile and README file.  To create lj2ps, simply type "make".
  170. XTo clean the directory, type "make clean".  Pretty simple, huh? ;-)
  171. XThere are probably other options in the Makefile, but since I
  172. Xregularly use "cake" (instead of make), and since I generated it with
  173. Xmkmf (automatic Makefile creator), I am not sure what they are.  Feel
  174. Xfree to edit it.  Those who are interested in the Cakefile, please
  175. Xcontact me.
  176. X
  177. XThe TestSuite directory contains many tests used to check the
  178. Xcompatibility of lj2ps with real LaserJets.  Similarly, the
  179. XMetricsSuite directory is used to tune lj2ps to produce output which
  180. Xlooks like LaserJet output.  These are discussed in more detail in the
  181. Ximplementation section below.
  182. X
  183. XThe documentation directory has several files in it.  Here are
  184. Xexplanations of them:
  185. X
  186. XBugFile        Known bugs that affect lj2ps are detailed here.  Each
  187. X        entry identifies the date detected, revision affected,
  188. X        and the person logging the bug (usually me!).  The
  189. X        LogFile describes which bugs have been fixed.
  190. X
  191. XCopying        This is the standard Free Software Foundation
  192. X        copyleft.  lj2ps is distributed according to these
  193. X        restrictions.  Please look through it so that you are
  194. X        familiar with the conditions of use for lj2ps.  The
  195. X        only other thing that I ask is that you send me
  196. X        changes (with descriptions) if you make them, so that
  197. X        I can benefit from your work.
  198. X
  199. XLogFile        This file contains descriptions of each revision of
  200. X        lj2ps.  All changes including bug fixes, added
  201. X        features, and removals are detailed here.
  202. X
  203. Xcompile.options.doc
  204. X        Options are available at compile-time to conditionally
  205. X        include or exclude features when the program is
  206. X        created.  This file describes the options currently
  207. X        available.
  208. X
  209. Xlimitations.doc    Any program worth its salt has certain limitations.
  210. X        lj2ps is no exception.  This file lists some that I
  211. X        know about.  Feel free to fix any (or all) of them.
  212. X
  213. Xlj2ps.l        The man page for lj2ps, to be installed in
  214. X        /usr/man/manl.  Use the command "nroff -man lj2ps.l"
  215. X        to create the documentation file.
  216. X
  217. Xmeasurements.doc
  218. X        One of the worst aspects of LaserJets is the many
  219. X        different measurements used by different commands,
  220. X        This file lists all measurements that I know of.
  221. X
  222. Xparameter.scanner.idraw
  223. X        A diagram of the parameter scanner.  This file was
  224. X        produced with the drawing program "idraw," and can be
  225. X        printed on any PostScript printer.
  226. X
  227. Xscanner.doc
  228. X        There are two distinct (yet related) scanners used in
  229. X        lj2ps.  Scanner.doc describes the conceptual design I
  230. X        used in creating them, which is derived from standard
  231. X        scanner and finite state automata theory taught in
  232. X        college (where do you think I learned it from? ;-).
  233. X
  234. Xsuggestions.doc    This file lists aspects of lj2ps that need work.  It
  235. X        may also provide some insight as to how lj2ps was
  236. X        designed.  If you have some free time, and need some
  237. X        suggestions on how to improve the program, then look
  238. X        here. 
  239. X
  240. Xsupported.commands.doc
  241. X        As detailed below, I did not have time to emulate all
  242. X        PCL commands.  This list shows which ones are (and
  243. X        are not) supported.
  244. X
  245. Xtext.scanner.idraw
  246. X        A diagram of the text scanner.  This file was produced
  247. X        with the drawing program "idraw," and can be printed
  248. X        on any PostScript printer.
  249. X
  250. X
  251. X3. Implementation Notes
  252. X
  253. XThe program is written completely in K&R C (although not ANSI), and
  254. Xthe C code should compile on nearly every standard machine out there.
  255. XTo my knowledge, I have not used any "strange" C operators or
  256. Xcombinations, so this program should work on anything from a PC to a
  257. Xsuper-computer.
  258. X
  259. XI built the program with the idea of emulating full LJII PCL, so all
  260. Xof the actual command syntax is parsed.  However, I have only
  261. Ximplemented the commands which I needed.  Left out are graphics,
  262. Xmacros, and soft font commands (among others).  It should not be that
  263. Xhard to add features to this program, and I have included variables
  264. X(some yet unused) for most (if not all) aspects of LaserJet operation.
  265. XFeel free to work on extending this program to emulate the unfinished
  266. XPCL commands, as well as fixing some of the inconsistencies that will
  267. Xlikely pop up.  All I ask is that you send me any changes that you
  268. Xmake, so I can add the same features to my own version (my address is
  269. Xlisted at the end of this file.
  270. X
  271. XI have designed lj2ps with efficiency in mind.  To this end, I
  272. Xhand-coded the scanner in C instead of generating it with Lex.  I have
  273. Xalso spent some time profiling the execution.  Although one major
  274. Xbottleneck has been fixed, most of the program actually runs at a
  275. Xreasonable rate.  As would be expected, much of the execution time is
  276. Xspent in the scanner and _doprnt.  The scanner could likely be sped up
  277. Xsome more (a colleague suggests "caching" several variables in
  278. Xregisters), but I have left this for the future.
  279. X
  280. XI have also designed the program with accuracy in mind.  Included in
  281. Xthis distribution are two suites of files: one for testing, the other
  282. Xfor accurate reproduction.  The test suite is an attempt at providing
  283. Xtest files which will exercise critical and nit-picky features of
  284. XLaserJet Series II printers.  It is by no means complete.  I have only
  285. Xincluded tests for features that are needed at our organization, and I
  286. Xhave likely even left out some of these.  I encourage you to add more
  287. Xfiles to the test suite; if several people contribute, a nice
  288. Xcollection could be created.  The metrics suite provides print samples
  289. Xwhich highlight different measurements.  For instance, you could test
  290. Xinter-line spacing by printing the appropriate metrics file on a
  291. XLaserJet and a PostScript printer, and then tweak lj2ps to match the
  292. XLaserJet's output.  This suite is also not complete, so feel free to
  293. Xadd more files.
  294. X
  295. X
  296. X4. Miscellaneous (Things I Have To Get Off My Chest)
  297. X
  298. XIt is unlikely that I will have any time at work to finish this
  299. Xprogram.  I will only support it locally for our own users.  Although
  300. Xit would be nice to work on this outside of my job, I have so many
  301. Xother program (and non-program) ideas that I likely won't do much more
  302. Xwith lj2ps.  Therefore it is up to you to build in the missing
  303. Xfunctionality that you want.
  304. X
  305. XEven though the major reason I wrote this was because our organization
  306. Xneeded it, a significant driving-force for me was a "proof of
  307. Xconcept."  I always thought that PostScript was a much better language
  308. Xthan LaserJet PCL, and this program provided me with a way to prove
  309. Xit.  Even though this revision of lj2ps is limited, I am convinced
  310. Xthat one could fully emulate a LaserJet with a filter (like lj2ps) and
  311. Xa PostScript printer.  In fact, I bet it could be done with PostScript
  312. Xalone, although it would be incredibly slow.  However, one cannot
  313. Xemulate a PostScript printer using PCL.  Most (if not all) PostScript
  314. Xto LaserJet emulators are programs (in software or hardware) which
  315. Xsend bitmaps to a LaserJet; PCL is pretty-much bypassed.  This says a
  316. Xlot about the two languages.
  317. X
  318. XI have spent several years writing programs which use PCL on
  319. XLaserJets.  I have just finished a translator that parses and emulates
  320. XPCL.  With all this experience and time spent using PCL, all I can say
  321. Xis that it leaves a really bad taste in my mouth.  It is not user
  322. Xfriendly, not consistent, and not robust.  Its syntax is lousy, its
  323. Xcommands are impossible to remember, and it inner workings are very
  324. Xhard to figure out (believe me, I spent too much time doing this!).
  325. XWhoever is responsible for developing PCL ought to be taught a lesson.
  326. XI have much respect for many Hewlett Packard products (like the hp28s
  327. Xand hp48sx calculators).  However, the LaserJet's language is one of
  328. XHP's worst creations.  Suffice it to say that the HP LaserJet is the
  329. XIBM PC of the laser-printer world.
  330. X
  331. X
  332. X5. Contacting Me
  333. X
  334. XIf you have any additions, fixes, or problems; need to know more about
  335. Xthe secret workings of the code; have suggestions for improving lj2ps;
  336. Xor simply want to say hello, you can contact me at:
  337. X
  338. X    Internet:    lishka@uwslh.slh.wisc.edu
  339. X    UUCP:        ...!uunet!uwvax!uwslh!lishka
  340. X
  341. X    Work phone:    (608) 262-4485 (Tues.-Sat., 5am-9pm)
  342. X
  343. X    Address:    Christopher Lishka
  344. X            Data Processing Dept.
  345. X            Wisconsin State Laboratory of Hygiene
  346. X            465 Henry Mall
  347. X            Madison, WI     53715
  348. X
  349. XMy only real request is that you send me any bug fixes, enhancements,
  350. Xor other modifications that you have made.  Please don't send source
  351. Xtrees without contacting me first.  The best thing to send is a
  352. Xcontext-diff (e.g. for "patch") from some released version.
  353. X
  354. XIf you like this program enough to donate some money, then I ask that
  355. Xyou give it to charity (for example: an environmental, peace, or
  356. Xhomeless organization).  It will make both of us feel good, and it is
  357. Xeven tax-deductible.
  358. SHAR_EOF
  359. $TOUCH -am 0630160890 README &&
  360. chmod 0664 README ||
  361. echo "restore of README failed"
  362. set `wc -c README`;Wc_c=$1
  363. if test "$Wc_c" != "9916"; then
  364.     echo original size 9916, current size $Wc_c
  365. fi
  366. fi
  367. # ============= Makefile ==============
  368. if test X"$1" != X"-c" -a -f 'Makefile'; then
  369.     echo "File already exists: skipping 'Makefile'"
  370. else
  371. echo "x - extracting Makefile (Text)"
  372. sed 's/^X//' << 'SHAR_EOF' > Makefile &&
  373. X# Project:    lj2ps, LaserJet PCL to PostScript translator
  374. X# File:        Makefile
  375. X#
  376. X# Author:    Christopher Lishka
  377. X# Organization:    Wisconsin State Laboratory of Hygiene
  378. X#        Data Processing Department
  379. X#
  380. X# Note: I use "cake" instead of "make" to build the lj2ps program from its
  381. X# source files.  However, because cake isn't as popular as make, I
  382. X# have included this Makefile in the general distribution.  Anyone who
  383. X# would like the Recipe file for cake can contact me.  However, it is
  384. X# heavily dependent on my working style, and may not suit everyone's
  385. X# tastes.  - Chris 
  386. X#
  387. X# Possible CFLAGS options:
  388. X#
  389. X# -DDEBUG        Compile in diagnostic print code 
  390. X# -DVERBOSE_WARNINGS    More types of warnings are printed
  391. X
  392. XPROGRAM          = lj2ps
  393. X
  394. XCFLAGS        = -O
  395. X
  396. XLDFLAGS          = -O
  397. X
  398. XLIBS          = -lm
  399. X
  400. XLINKER          = cc
  401. X
  402. X# ----------------------------------------------------------------------
  403. X
  404. XDEST          = .
  405. X
  406. XEXTHDRS          = /usr/include/ctype.h \
  407. X        /usr/include/math.h \
  408. X        /usr/include/stdio.h \
  409. X        /usr/include/strings.h
  410. X
  411. XHDRS          = errors.h \
  412. X        lj.h \
  413. X        lj2ps.h \
  414. X        ljcmds.h \
  415. X        ljfonts.h \
  416. X        scan.h \
  417. X        transform.h
  418. X
  419. XOBJS          = errors.o \
  420. X        lj.o \
  421. X        lj2ps.o \
  422. X        ljcmds.o \
  423. X        ljfonts.o \
  424. X        scan.o \
  425. X        transform.o
  426. X
  427. XSRCS          = errors.c \
  428. X        lj.c \
  429. X        lj2ps.c \
  430. X        ljcmds.c \
  431. X        ljfonts.c \
  432. X        scan.c \
  433. X        transform.c
  434. X
  435. XMAKEFILE      = Makefile
  436. X
  437. XPRINT          = pr
  438. X
  439. X# ----------------------------------------------------------------------
  440. X
  441. Xall:        $(PROGRAM)
  442. X
  443. X$(PROGRAM):     $(OBJS)
  444. X        @echo -n "Loading $(PROGRAM) ... "
  445. X        @$(LINKER) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
  446. X        @echo "done"
  447. X
  448. Xclean:;        @rm -f $(OBJS)
  449. X
  450. Xdepend:;    @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST)
  451. X
  452. Xindex:;        @ctags -wx $(HDRS) $(SRCS)
  453. X
  454. Xinstall:    $(PROGRAM)
  455. X        @echo Installing $(PROGRAM) in $(DEST)
  456. X        @install -s $(PROGRAM) $(DEST)
  457. X
  458. Xprint:;        @$(PRINT) $(HDRS) $(SRCS)
  459. X
  460. Xprogram:        $(PROGRAM)
  461. X
  462. Xtags:           $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS)
  463. X
  464. Xupdate:        $(DEST)/$(PROGRAM)
  465. X
  466. X$(DEST)/$(PROGRAM): $(SRCS) $(LIBS) $(HDRS) $(EXTHDRS)
  467. X        @make -f $(MAKEFILE) DEST=$(DEST) install
  468. X###
  469. Xerrors.o: /usr/include/stdio.h errors.h lj2ps.h lj.h
  470. Xlj.o: /usr/include/stdio.h lj.h ljcmds.h ljfonts.h scan.h lj2ps.h
  471. Xlj2ps.o: /usr/include/stdio.h /usr/include/math.h lj2ps.h lj.h transform.h \
  472. X    errors.h
  473. Xljcmds.o: /usr/include/stdio.h /usr/include/math.h ljcmds.h lj.h ljfonts.h \
  474. X    scan.h lj2ps.h
  475. Xljfonts.o: /usr/include/strings.h ljfonts.h lj.h
  476. Xscan.o: /usr/include/stdio.h /usr/include/ctype.h scan.h lj.h lj2ps.h
  477. Xtransform.o: /usr/include/stdio.h transform.h scan.h lj2ps.h lj.h
  478. SHAR_EOF
  479. $TOUCH -am 0630160790 Makefile &&
  480. chmod 0644 Makefile ||
  481. echo "restore of Makefile failed"
  482. set `wc -c Makefile`;Wc_c=$1
  483. if test "$Wc_c" != "2518"; then
  484.     echo original size 2518, current size $Wc_c
  485. fi
  486. fi
  487. echo "End of part 1, continue with part 2"
  488. exit 0
  489.  
  490.